Skip to main content

BM10 两个链表的第一个公共结点

描述

输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的) 例如,输入3,5,7时,两个无环的单向链表的结构如下图所示:

输入描述

输入分为是3段,第一段是第一个链表的非公共部分,第二段是第二个链表的非公共部分,第三段是第一个链表和第二个链表的公共部分。 后台会将这3个参数组装为两个链表,并将这两个链表对应的头节点传入到函数FindFirstCommonNode里面,用户得到的输入只有pHead1和pHead2。

返回值描述

返回传入的pHead1和pHead2的第一个公共结点,后台会打印以该节点为头节点的链表。

使用Hash表

package main
import . "nc_tools"
/*
* type ListNode struct{
* Val int
* Next *ListNode
* }
*/

/**
*
* @param pHead1 ListNode类
* @param pHead2 ListNode类
* @return ListNode类
*/
func FindFirstCommonNode( pHead1 *ListNode , pHead2 *ListNode ) *ListNode {
if pHead1==nil||pHead2==nil{
return nil
}
hashMap:=make(map[*ListNode]bool)
nowNode:=pHead1
for nowNode!=nil{
hashMap[nowNode]=true
nowNode=nowNode.Next
}
nowNode2:=pHead2
for nowNode2!=nil{
if hashMap[nowNode2]{
return nowNode2
}
nowNode2=nowNode2.Next
}
return nil
}

但我看了一下官方解,发现了一个更优秀的解。我们使用hash表,需要复制出其中一个链表的所有数据。 但我们其实可以直接使用双指针来实现求解。

双指针


func FindFirstCommonNode( pHead1 *ListNode , pHead2 *ListNode ) *ListNode {
// write code here
var head1,head2 *ListNode
head1=pHead1
head2=pHead2

for head1!=head2{
if head1==nil{
head1=pHead2
}else{
head1=head1.Next
}
if head2==nil{
head2=pHead1
}else{
head2=head2.Next
}
}
return head1
}